原帖 | Jason | 2026-08-17 15:41 | 👍0 | 阅读约1
Linux 电容多点触摸驱动开发流程:
1. I2C驱动匹配,进入probe。
2. probe中完成:解析设备树、复位触控IC、申请中断、创建input设备、配置ABS坐标范围、初始化MT slots、注册input设备。触摸IC I2C读写会睡眠,中断要用线程化中断,不能放在硬中断上下文。
3. 中断线程里:I2C读取IC触点数据,按Type‑B协议遍历所有slot上报状态与坐标,最后同步提交事件。
重点 Debug 调试经验干货分享
1. 中断完全不触发:检查设备树引脚配置;RST复位时序,触控IC是否正常初始化;INT引脚电平与中断触发边沿是否匹配;供电是否正常。
2. 中断能进入,但evtest看不到触摸事件
大概率忘记调用同步;没有执行input_mt_init_slots;input设备事件位没有正确设置。
3. 单点正常,多指乱跳、触点不消失、手指漂移:只上报正在触摸的slot,已经抬起的slot没有置为失效,内核保留旧触点状态。Type‑B务必循环遍历全部slot。
4. 坐标XY颠倒、坐标镜像:不是协议问题,是触控IC输出坐标系和屏幕物理方向不一致,驱动层做坐标转换处理。
5. 休眠唤醒之后触摸失效:suspend/resume流程缺失。休眠I2C控制器关闭、中断被关闭,唤醒后没有重新复位初始化触控IC。
6. evtest调试手段:evtest是排MT协议的第一工具(GT911 调试速查见 Linux Android GT911触控调试),直接看 ABS_MT_* 事件序列。
- 看slot切换是否正确;
- 看手指抬起时TRACKING_ID是否变成‑1;
- 观察每一帧结束有没有SYN_REPORT同步事件。
7. 协议混用问题:Type‑A、Type‑B接口不能混用,会造成input子系统解析错乱,现象就是事件混乱、触点数量异常。
相关笔记
- 📁 返回本主题 MOC
- 从MCU转Linux BSP开发
- Linux Android GT911触控调试
- 嵌入式Linux调试iic
- 老师,学习Android Camera架构时
- 同样是做 Linux BSP 驱动,在芯片原厂和终端厂有什么不一样
- 嵌入式 Linux 橙皮书系列更新 v2.0.0 版本